package com.cloud.jwt;

import com.alibaba.fastjson.JSON;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.SneakyThrows;
import org.springframework.stereotype.Component;

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Date;

@Component
public class JwtUtil {

    // 使用固定的  或者每次随机生成
    private static PublicKey publicKey;
    private static PrivateKey privateKey;

    @SneakyThrows
    public JwtUtil() {
//        // 创建一个 SecureRandom 实例用于生成安全的随机数
//        SecureRandom secureRandom = new SecureRandom();
//
//        // 创建一个 32 字节的数组，32 字节 = 256 位
//        byte[] key = new byte[32];
//
//        // 填充数组，生成一个 256 位的随机密钥
//        secureRandom.nextBytes(key);
//
//        // 将字节数组转换为 Base64 编码的字符串
//        StringBuilder stringBuilder = new StringBuilder();
//        for (byte b : key) {
//            stringBuilder.append(String.format("%02x", b));
//        }
//        SECRET_KEY = stringBuilder.toString();

        // 生成 RSA 密钥对
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048); // 密钥长度为 2048 位
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        // 获取私钥和公钥
        PrivateKey privateKey = keyPair.getPrivate();
        PublicKey publicKey = keyPair.getPublic();
        System.out.println("privateKey:" + privateKey);
        System.out.println("publicKey:" + publicKey);
        this.publicKey = publicKey;
        this.privateKey = privateKey;
    }

    // 生成 JWT
    public static String generateToken(User user) {


        String addressJson = JSON.toJSONString(user.getAddress());
        return Jwts.builder()
                .setSubject(user.getUsername())  // 设置主题，通常存储用户名或用户ID
                .claim("email", user.getEmail())  // 添加自定义的声明，比如email
                .claim("phone", user.getPhone())  // 添加手机号
                .claim("department", user.getDepartment())  // 添加部门
                .claim("address", addressJson)
                .setIssuedAt(new Date())  // 设置签发时间
//                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))  // 设置过期时间，1小时
                .signWith(privateKey, SignatureAlgorithm.RS256)  // 使用HS256算法签名
                .compact();  // 生成JWT
    }

    // 解析 JWT
    public static Claims parseToken1(String token) {
        return Jwts.parser()
                .setSigningKey(publicKey)  // 设置签名的秘钥
                .parseClaimsJws(token)  // 解析JWT
                .getBody();  // 获取载荷部分的Claims
    }

    // 从JWT中提取用户名
    public static String extractUsername(String token) {
        return parseToken1(token).getSubject();  // 获取JWT的主体
    }

    public static User parseToken(String token) {
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(publicKey)  // 设置密钥
                    .parseClaimsJws(token)  // 解析 token
                    .getBody();

            String username = claims.getSubject();  // 获取用户名
            String email = claims.get("email", String.class);  // 获取邮箱

            // 获取 address 字段并将其反序列化为 Address 对象
            String addressJson = claims.get("address", String.class);
            Address address = JSON.parseObject(addressJson, Address.class);

            // 返回包含所有字段的 User 对象
            User user = new User();
            user.setUsername(username);
            user.setEmail(email);
            user.setAddress(address);
            return user;
        } catch (Exception e) {
            throw new RuntimeException("Error parsing token", e);
        }
    }

    // 检查JWT是否过期
//    public static boolean isTokenExpired(String token) {
//        Date expiration = parseToken(token).getExpiration();  // 获取过期时间
//        return expiration.before(new Date());  // 判断当前时间是否在过期时间之后
//    }
}
